!% -SD !Laura, by Michael Thomét (cobalt) !Created for Interactive Fiction Writing Month !Week Three Submission !v .2 !This work is licensed under a Creative Commons Attribution-Noncommercial 3.0 United States License. !======================================= Constant Story "Laura"; Constant Headline "^Laura By Michael Thomét^"; Include "Parser"; Include "VerbLib"; Statusline time; !======================================= !Attributes attribute sharp; attribute egress; !======================================= !Classes Class s_clothesline (20) !The complicated and frustrating ropes. with name 'clothes' 'line' 'clothesline' 'clothelines//p', short_name [; print self.o_length, "-foot length of clothesline"; rtrue;], plural [; print self.o_length, "-foot lengths of clothesline"; rtrue;], hardness 3, o_length, tied false, parse_name [x j i flag; if (parser_action == ##TheSame) { if (parser_one.o_length ~= parser_two.o_length) return -2; return -1; } for (:: i++, flag = false) {; switch (NextWordStopped()) { 'clothes', 'line', 'clothesline', 'foot': flag = true; 'clotheslines': flag = true; parser_action = ##PluralFound; !requesting objects by length '1//', 'one', 'one-foot', '1-foot': if(self.o_length == 1) flag = true; else flag = false; '2//', 'two', 'two-foot', '2-foot': if(self.o_length == 2) flag = true; else flag = false; '3//', 'three', 'three-foot', '3-foot': if(self.o_length == 3) flag = true; else flag = false; '4//', 'four', 'four-foot', '4-foot': if(self.o_length == 4) flag = true; else flag = false; '5//', 'five', 'five-foot', '5-foot': if(self.o_length == 5) flag = true; else flag = false; '6//', 'six', 'six-foot', '6-foot': if(self.o_length == 6) flag = true; else flag = false; '7//', 'seven', 'seven-foot', '7-foot': if(self.o_length == 7) flag = true; else flag = false; '8//', 'eight', 'eight-foot', '8-foot': if(self.o_length == 8) flag = true; else flag = false; 'first', '1st': !The 'first' through 'eighth' problem objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 1) { if(self == x) flag = true; else flag = false; } } 'second', '2nd': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 2) { if(self == x) flag = true; else flag = false; } } 'third', '3rd': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 3) { if(self == x) flag = true; else flag = false; } } 'fourth', '4th': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 4) { if(self == x) flag = true; else flag = false; } } 'fifth', '5th': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 5) { if(self == x) flag = true; else flag = false; } } 'sixth', '6th': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 6) { if(self == x) flag = true; else flag = false; } } 'seventh', '7th': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 7) { if(self == x) flag = true; else flag = false; } } 'eighth', '8th': objectloop(x provides o_length && x.o_length == self.o_length && x ofclass s_clothesline) { if(ObjectIsUntouchable(x, true) == false) j++; if(j == 8) { if(self == x) flag = true; else flag = false; } } -1: return i; default: return i; } if (flag == false) return i; } ], create [ len loc; self.o_length = len; move self to loc; ], description [; switch(self.o_length){!Variable description 1: "A small section of strudy clothesline, about one foot in length. Only the Master's socks will fit on it now. Whatever have you done?"; 2: "A small section of strudy clothesline, about two feet in length. You might still be able to fit one of Master's shirts on the clothesline."; 3: "A section of strudy clothesline, about three feet in length. You could still use this to hold a pair of trousers and Master's pants."; 4: "A section of strudy clothesline, about four feet in length. You could probably fit one of Master's shirts and undershirt on the line."; 5: "A small section of strudy clothesline, about five feet in length. You're sure you could fit all of Master's underwears on a line this size."; 6: "A large section of sturdy clothesline, about six feet in length. Master's coat, shirt and socks would probably fit on here all at once."; 7: "A large section of sturdy clothesline, about seven feet in length. You could fit Master's entire outfit, besides his undershirt on here."; 8: "A large section of sturdy clothesline, about eight feet in length. Master's whole outfit fits on line of this length."; default: "A section of clothesline about ", self.o_length, " feet in length."; } ], before [; Take: if(self in sq_hook) { if(player notin top_bunk) "You'll have to get closer than that."; } myCut: if(second ~= nothing) if(second notin newPlayer) "You're not holding ", (the) second, "."; if(noun notin newPlayer) "You're not holding ", (the) noun, "."; if(second provides hardness) { if(noun provides o_length) { if(second.hardness > self.hardness) { if(noun.o_length / 2 > 1 || noun.o_length == 2) { s_clothesline.create(self.o_length / 2, parent(self)); s_clothesline.create(self.o_length / 2, parent(self)); s_clothesline.destroy(self); "You cut the clothesline in half."; } print_ret (The) noun, " is too small to cut any further."; } "You try to use ", (the) second, " to cut ", (the) noun, ", but ", (the) second, " is not strong enough."; } "You can't divide something like that."; } "There is no edge on ", (the) second; Tie: if(second ~= nothing) if(second notin newPlayer) "You're not holding ", (the) second, "."; if(second == nothing && noun.o_length >= 3) { if(self in sq_hook) { if(noun.tied == 2) "You've already made a second loupe in ", (the) noun, "."; noun.tied = 2; "You tie a second loupe in ", (the) noun, "."; } if(noun.tied == 1) "You've already made a loupe in ", (the) noun, "."; noun.tied = 1; "You tie a loupe in ", (the) noun; } if(second == nothing && noun.o_length < 3) "The line is too small for that."; if(noun == second) { <>; } if(second ofclass s_clothesline) { if(noun notin newPlayer) "You're not holding ", (the) noun, "."; s_clothesline.create(noun.o_length + second.o_length, temp_holder); move temp_holder to parent(noun);!A hack for keeping track of instanced objects move noun to child(temp_holder); !I used the parent/child tree to create a fake container move second to child(temp_holder);!to make a legacy of objects that made up the object after move child(temp_holder) to parent(temp_holder);!being tied to another piece. remove temp_holder; "You tie ", (the) noun, " to ", (the) second, "."; } Untie: if(second == nothing) { if(children(noun) == 2) { if(noun notin newPlayer) "You're not holding ", (the) noun, "."; move child(noun) to parent(noun); move child(noun) to parent(noun); print "You untie ", (the) noun, " from ", (string) PronounNom(noun), "self."; s_clothesline.destroy(noun); rtrue; } if(noun provides tied && noun.tied == 1) { if(self in sq_hook) "You would need to remove it from the hook to take out the loupe."; if(noun notin newPlayer) "You're not holding ", (the) noun, "."; noun.tied = 0; "You remove the loupe from ", (the) noun, "."; } if(noun provides tied && noun.tied == 2) { noun.tied = 1; "You remove the second loupe from ", (the) noun, "."; } rfalse; } if(noun == second) <>; Enter: if(self in sq_hook && newPlayer in top_bunk && self.tied == 2) { print "Will you do it, can you do it? Actually hang yourself?^"; if(YesOrNo()) { if(self.o_length > 3) { move newPlayer to Quarters; "You step off the bed and fall the seven feet to the floor, where you land with a loud thump. You take the loupe off your neck."; } newPlayer.hanging = true; newPlayer.breathless = 6; newPlayer.breath_length = 6; "You slip the loupe over your neck and step off the bed. The loupe jerks before your feet reach the floor and white spots form in your vision for a second. A throbbing pain bursts at the top of your neck. You can't breathe!"; } else "No, of course not. Laura, could you really do that to Master Rogan, after all he has done for you? Maybe you should get back to work."; } ]; !======================================= ! Game Objects Object Kitchen "Kitchen" with description "In the center of the kitchen is a large, square table, made of white ash. There is only about two feet of space between the table and the cabinets, a space to which you have become accustomed. The cabinets are also made of ash, but have greyed with time. The most amount of space available is in front of the gas stove, set back against the corner opposite the doorway into the living quarters. A gas lamp is set into the wall by the doorway but Master Rogan forbids its use. Kitchen work should be done by sundown, when the Master arrives home. You can go into the living quarters from here.", s_to Living, has light; !Objects needed: table, stove, cabinets, gas lamp, gas valve?, icebox? Object toKitchen "doorway" with description "", name 'kitchen', before [; Go, Enter: if(self in Kitchen) "You look around and realize that you're already there."; <>; Exit: if(self notin Kitchen) "But you aren't in the kitchen, you realize."; <>; ], door_dir[; if(self in Kitchen) return Living; return Kitchen;], found_in Living Kitchen, has scenery concealed egress; Object k_knife "kitchen knife" Kitchen with description "A sharp knife, used to chop potatoes and separate chicken.", hardness 5, name 'knife' 'blade' 'sharp', has sharp; Object Bedroom "Master's Bedroom" with description "The main features of Master Rogan's bedroom are his large, four post bed and his vanity. The bed sits in the middle of the wooden floor, the frame made from a dark wood. The vanity sits next to a small wardrobe, upon which a hook rests for the hanging of Master's coat. On the other side of the bed is Master's bathtub, which he uses every Saturday, and which you fill with hot water heated on the stove in a large washbasin. A gas lamp is set in the wall beside Master's vanity. Every morning you come here to fetch the Master's clothing and set the bed. You can go back into the living quarters from here.", e_to Living, has light; !objects needed: bed, vanity, tub, wardrobe, lamp Object toBedroom "doorway" with description "", name 'master^s' 'bedroom' 'master', before [; Enter: if(self in Bedroom) "You look around and realize that you're already there."; <>; Exit: if(self notin Bedroom) "But you aren't in Master's bedroom, you realize."; <>; ], door_dir[; if(self in Bedroom) return Living; return Bedroom;], found_in Living Bedroom, has scenery concealed egress; Object Living "Living Quarters" with description "The only room with two gas lamps, the Living Quarters is a long, narrow room. At the end nearest the kitchen, a small table for dining has been set up. One of the gas lamps rests in the wall above the table. At the other end, near the stairs to the second floor, a wide, low bookshelf rests against the wall. A fireplace sits on the outer wall, in front of which is the Master's reading chair. The other gas lamp sits at the bottom of the stairs, opposite to the fireplace. Occasionally, Master Rogan entertains guests, and you have to bring extra chairs from the laundry upstairs. The door outside is in the center of the room, a few feet from the fireplace. You can go upstairs, into the kitchen and into Master Rogan's bedroom from here.", w_to Bedroom, n_to Kitchen, u_to Hallway, has light; !objects needed: table, chair, bookshelf, fireplace, door, lamp1, lamp2 Object toLiving "doorway" with description "", name 'living' 'quarters//p', before [; Go, Enter: if(self in Living) "You look around and realize that you're already there."; if(self in Kitchen) <>; if(self in Bedroom) <>; if(self in Hallway) <>; Exit: if(self notin Living) "But you aren't in the living quarters, you realize."; "You'll need to decide on somewhere to go."; ], door_dir[; if(self in Kitchen) return Living; if(self in Bedroom) return Living; if(self in Hallway) return Living; return random(Kitchen, Bedroom, Hallway);], found_in Kitchen Bedroom Hallway Living, has scenery concealed egress; Object Hallway "Servants' Hall" with description "The hallway is a small, narrow room at the top of the stairs. A rug has been placed over the wooden floor to protect it from your shuffling in this space between the laundry, the servants' quarters and the linen closet. This is the only room of the house that has no lighting. You can go to the laundry, your quarters, the linen closet, and downstairs to the living quarters from here.", d_to Living, n_to Laundry, s_to Quarters, e_to Linen, has light; !Objects needed: rug Object toHallway "doorway" with description "", name 'hallway' 'hall' 'servant^s' 'servant' 'stairs//p', before [; Go, Enter: if(self in Hallway) "You look around and realize that you're already there."; if(self in Living) <>; if(self in Quarters) <>; if(self in Linen) <>; if(self in Laundry) <>; Exit: if(self notin Hallway) "But you aren't in the servant's hall, you realize."; "You'll need to decide on somewhere to go."; ], door_dir[; if(self in Living) return Hallway; if(self in Laundry) return Hallway; if(self in Linen) return Hallway; if(self in Quarters) return Hallway; return random(Quarters, Living, Linen, Laundry);], found_in Living Quarters Linen Laundry Hallway, has scenery concealed egress; Object Laundry "Laundry" with description "The laundry is a large room that sits over the kitchen. Sometimes you can smell the day's cooking while you are washing the Master's clothes. The room contains a small gas stove for heating wash water and a sink where you clean any dishes used during the day. There is also a cushioned chair, your only comfort, for when you have to do mending on your's or Master's clothes. There is also a clothesline from which you hang the wash to dry. A large window sits in front of the line, opened on dry days to help the drying. A gas lamp sits in the wall over the stove. You can go to the hallway from here.", s_to Hallway, has light; !Objects needed: stove, lamp, sink, window Object toLaundry "doorway" with description "", name 'laundry', before [; Go, Enter: if(self in Laundry) "You look around and realize that you're already there."; <>; Exit: if(self notin Laundry) "But you aren't in the laundry, you realize."; <>; ], door_dir[; if(self in Laundry) return Hallway; return Laundry;], found_in Hallway Laundry, has scenery concealed egress; Object clothesline "clothesline" Laundry with description "The closeline where you hang the Master's clothes.", hardness 3, o_length 8, before [; myCut: if(second provides hardness) { if(noun provides o_length) { if(second.hardness > self.hardness) { if(noun.o_length / 2 > 1 || noun.o_length == 2) { s_clothesline.create(noun.o_length, parent(self)); remove self; "You cut through the thick clothesline with ", (the) second, " and watch it fall to the floor. Now there is nothing on which to dry the Master's clothes."; } print_ret (The) noun, " is too small to cut any further."; } "You try to use ", (the) second, " to cut ", (the) noun, ", but ", (the) second, " is not strong enough."; } print_ret "You can't divide something like that."; } "There is no edge on ", (the) second; ], name 'clothesline' 'clothes//p' 'line', has scenery; Object Quarters "Servants' Quarters" with description "Your place of refuge. Your room, which you share with the groundskeeper, Stephen, is a tiny room where you spend about six hours a night, forgetting the life you've been given. A bunk bed sits against the wall, in front of the window that faces the morning sun. A small wardrobe sits next to the doorway, containing the thin clothes that you and Stephen both wear. An oil lamp hangs from a sturdy hook secured to a thick beam in the celing, the only room with oil lighting. Master Rogan gives you very little oil to fill the lamp. You can go to the hallway from here.", n_to Hallway, has light; !Objects needed: top bunk, bottom bunk, lamp, hook, beam, window Object toQuarters "doorway" with description "", name 'servants^' 'servants' 'servant' 'quarter' 'quarters//p', before [; Go, Enter: if(self in Quarters) "You look around and realize that you're already there."; <>; Exit: if(self notin Quarters) "But you aren't in your quarters, you realize."; <>; ], door_dir[; if(self in Quarters) return Hallway; return Quarters;], found_in Hallway Quarters, has scenery concealed egress; Object sq_hook "sturdy hook" Quarters with description "A thick, iron hook driven into a wooden beam.", name 'sturdy' 'hook', capacity 1, react_before [; if(noun == nothing) rfalse; if(parent(noun) == self && action ~= ##Examine && parent(newPlayer) ~= top_bunk) "You'll need to get closer if you want to do anything to ", (the) noun, "."; Puton: if(children(self) >= self.capacity && second == self) "There's enough on the hook already."; if(child(top_bunk) ~= newPlayer && second == self) "You're too far away from ", (the) self, "."; if(noun provides o_length && noun provides tied && second == self) { if(noun.tied == false) { move noun to parent(self); "You place ", (the) noun, " on ", (the) self, " and watch as it slides off and onto the floor."; } move noun to self; "The loupe of ", (the) noun, " tightens over ", (the) self, "."; } "That isn't something that you can put on the hook."; !fix to put the lamp back on there! Take: if(noun notin self && second == self) "What are you talking about? There's nothing like that in ", (the) self, "."; if(child(top_bunk) ~= newPlayer && second == self) "You're too far away from ", (the) self, "."; if(noun == self) "The hook is too firmly attached."; ], has scenery concealed supporter transparent; Object sq_lamp "oil lamp" sq_hook with description "An oil lamp.", name 'oil' 'lamp', has concealed; Object top_bunk "top bunk" Quarters with description "Your bunk.", name 'top' 'bunk' 'bed', add_to_scope sq_lamp, react_before [; if(noun == nothing) rfalse; if(parent(noun) == Quarters && noun ~= sq_hook && noun ~= self && action ~= ##Examine && parent(newPlayer) == self) "You'll need to get down if you want to do anything to ", (the) noun, "."; Take: if(newPlayer notin self) rfalse; if(parent(noun) ~= top_bunk or sq_hook) "You can't reach ", (the) noun, " from here."; Go: if (noun == d_obj) <>; if (noun == u_obj) <>; ], capacity 1, has supporter scenery concealed enterable transparent; Object Linen "Linen Closet" with description "This room, which is the same size as your own quarters, is lined on one wall with shelves, upon which are a number of linens. Master Rogan has a wide variety, depending on the weather. The linens for your bed are on a separate shelf, with much smaller of a selection. A tiny gas lamp sits next to the way to the hallway.", w_to Hallway, has light; !Objects needed: shelves, linens, cheap linens, small shelves, lamp. Object toLinen "doorway" with description "", name 'linen' 'closet', before [; Go, Enter: if(self in Linen) "You look around and realize that you're already there."; <>; Exit: if(self notin Linen) "But you aren't in the linen closet, you realize."; <>; ], door_dir[; if(self in Linen) return Hallway; return Linen;], found_in Hallway Linen, has scenery concealed egress; !======================================= ! Player Objects Object newPlayer "yourself" with description "It's just little, old, insignificant you.", breathless 0, breath_length 0, last_work 0, hanging false, passing false, react_before [; if(self.breathless > 0 && action ~= ##Breathe) { if(self.hanging == true) <>; self.breath_length++; print "You gasp for air! "; if(self.breath_length - self.breathless > 4) <>; rtrue; } self.last_work++; Work: self.last_work = 0; print "You do some work around ", (the) real_location, ".^"; rfalse; Kill: if(noun == self) "You couldn't do that, no. Maybe. But how?"; if(noun has animate) print_ret "You couldn't do that to ", (the) noun, ", not after all ", (string) PronounNom(noun), " has done for you."; print_ret "You aren't sure how you could do that to ", (the) noun; Breathe: if(self.hanging == true) { switch(self.breath_length - self.breathless) { 0: self.breathless--; print "You can't breathe! You open your mouth, but no air enters your throat. The clothesline cuts into your throat.^"; 1: self.breathless--; print "You beat your chest. Pain blooms on your breast where you pound, trying to force your lungs open. The clotheline only tightens. This HURTS.^"; 2: self.breathless--; print "Your vision blurs. You claw at the clothesline, but your fingertips can't seem to feel the rope. Was this the way?^"; 3: self.breathless--; print "You grasp at the clothesline above you, but holding your hands above your head makes you dizzy and drowsy. Couldn't there have been another way?^"; 4: self.breathless--; print "A pain erupts in your lungs. You twist your fingers into knots. Your vision blackens and you feel sleepy. The pain seems to be fading, slowing. Sleep seems like a good idea.^"; default: self.breathless = 0; print "You drift of to sleep.^"; deadflag = 3; } rtrue; } if(self.breathless == 0) rfalse; switch(self.breath_length - self.breathless) { 0: self.breathless--; print "You can't breathe! You open your mouth, but no air enters your throat."; 1: self.breathless--; print "You beat your chest. Pain blooms on your breast where you pound, trying to force your lungs open."; 2: self.breathless--; print "You tilt your head back and open your mouth wider, and you bite the air, trying to force it down."; 3: self.breathless--; print "You claw at your throat, trying to open it wider to let in air."; 4: self.breathless--; print "A pain erupts in your lungs. You twist your fingers into knots, clawing at the floor."; default: self.breathless = 0; PassOut(); } if(self.breathless == 0) " A gulp of cool air enters your lungs. You place a hand on your breast and feel it rise and fall for a moment.^"; print "^"; rtrue; ], each_turn [; if(self.breathless == 0) if (the_time > (60*(12+11)+30) || the_time < (60*(7)+30)) { SetTime(60*(7)+(30), 5); if (location == Quarters) { print "You yawn. It's already the middle of the night. If you don't go to bed now, then you won't be able to rise at dawn the next day. You prepare your bed and drift off to sleep.^"; } else { print "You yawn. It's already the middle of the night. If you don't go to bed now, then you won't be able to rise at dawn the next day. You make your way to your quarters and prepare your bed. Then, you drift off to sleep.^"; } move player to top_bunk; } ], has concealed animate proper transparent; Object temp_holder "temporary holder" with description ""; Object Rogan "Master Rogan" Kitchen with description "Master Rogan is a tall man with a stiff frame. He has dark, fierce eyes that you have learned to avoid with your own. His hands are strong, rough and there is a callous on his left index finger. Master Rogan bites his nails; they are often jagged.", name 'Master' 'Rogan' 'man' 'owner', tension 0, react_before [; Work: if(self.tension == 0) print_ret (The) self, " ignores you."; self.tension = 1; print_ret (The) self, " smiles as you do your work."; ], orders [; if(newPlayer.breathless > 0) "You gasp for air!"; !Do nothing if the player is out of control. switch(self.tension) { 0: self.tension++; "~Laura,~ Master Rogan says. ~You try my patience.~"; 1: self.tension++; "~Do I have to remind you who owns whom?~ Master Rogan says."; 2: self.tension++; newPlayer.breathless = 3; !Gasping for air for three rounds. newPlayer.breath_length = 3; !Used to measure how long she's been breathless. "Master Rogan wraps his large, right hand around your tiny wrist and throws you to the floor. ~The owner does not take commands, urcin,~ Master Rogan says. He drives a foot into your stomach. You can't breathe!"; default: self.tension = 0; } ], daemon [i j x adj room; if(parent(newPlayer) ~= parent(self)) self.tension--; if(self.tension == -1) self.tension = 0; i = random((self.tension * 3) + 5); if(i == 1){ i = 0; objectloop(x in location && x has egress && x ~= Hallway) i++; j = random(i - 1); i = 0; objectloop(x in compass) { room = parent(self); adj = room.(x.door_dir); if(adj ofclass Object && adj ~= Hallway) { i++; if(i == j) { room = parent(self); if(room == parent(newPlayer)) print (The) self, " walks into ", (the) adj, ".^"; move self to adj; if(parent(self) == parent(newPlayer)) print (The) self, " arrives from ", (the) room, ".^"; rtrue; } } } } ], each_turn [ slamobj; if(parent(newPlayer) ~= parent(self)) rtrue; if(action == ##Work) rtrue; switch(self.tension) { 0: self.tension++; rtrue; 1 to 3: self.tension++; print_ret (The) self, " watches you closely with his fierce eyes."; 4: self.tension++; print_ret "~Laura,~ ", (the) self, " says."; 5: self.tension++; print_ret "~I said, 'Laura,'~ ", (the) self, " says."; 6: self.tension++; print_ret "~Answer me when I talk to you,~ ", (the) self, " says."; 7: self.tension++; print_ret "~What are you doing, urchin?~ ", (the) self, " says."; 8: self.tension++; print_ret (The) self, " strikes your face with the back of ", (string) PronounPos(self), " hand. ~What is the matter with you?~ ", (string) PronounNom(self), " says."; 9: self.tension++; objectloop (slamobj in parent(self) && slamobj has scenery && slamobj hasnt animate && slamobj hasnt egress) print_ret (The) self, " shoves you against ", (the) slamobj, ". ~Insolent bitch,~ ", (string) PronounNom(self), " says. ~Get to work.~"; objectloop (slamobj in parent(self) && slamobj has egress) print_ret (The) self, " shoves you against ", (the) slamobj, ". ~Insolent bitch,~ ", (string) PronounNom(self), " says. ~Get to work.~"; default: self.tension = 0; print (The) self, " strikes the back of your head with ", (string) PronounPos(self), " his fist. ~Bitch needs a lesson,~ ", (string) PronounNom(self), " says.^"; newPlayer.passing = true; rtrue; } ], has animate male proper; !======================================= ! Entry Point Routines [ Initialise; SetTime(60*(8)+(30), 5); banner(); move newPlayer to Kitchen; ChangePlayer(newPlayer); print "^When you were very young, you were bought by Master Rogan to do housework, and have lived in his house ever since. It's been twenty years. You've gotten into a routine, between the beatings and sleepless nights. The best refuge you get is when you get to mend clothes, able to sit down in a nice chair and to the mindless work, left to your thoughts. You always are thinking to yourself, ~Laura, is there anything else out there, beyond the door?~, but there's nothing you can do to find out.^"; StartDaemon(Rogan); return 2; ]; [ DeathMessage; if(deadflag == 3) { print "So, darkness. You feel like you're floating along in the darkness, gently swaying back and forth. Was there another way? Perhaps. But for now, you feel ready to face what comes.^^You have died."; } ]; [ TimePasses; if(newPlayer.passing) PassOut(); ]; !======================================= ! Other Routines Routines [ PronounAcc i; if (i hasnt animate || i has neuter) return "it"; else { if (i has female) return "her"; else return "him"; }]; [ PronounNom i; if (i hasnt animate || i has neuter) return "it"; else { if (i has female) return "she"; else return "he"; }]; [ PronounPos i; if (i hasnt animate || i has neuter) return "its"; else { if (i has female) return "her"; else return "his"; }]; [ CPronounNom i; if (i hasnt animate || i has neuter) return "It"; else { if (i has female) return "She"; else return "He"; } ]; [PassOut x; SetTime(the_time + 60); objectloop (x) { if(x in newPlayer) move x to location; } move newPlayer to top_bunk; newPlayer.Passing = false; "Everything fades to black. After about an hour, you wake up in your bed, a pain throbbing from behind your eyes and growing all over your body."; ]; !======================================= ! Grammars Include "Grammar"; extend only 'kill' 'murder' replace * noun -> Kill; extend only 'run' replace * 'away' -> RunAway * noun -> Go * enterable -> Enter; extend only 'q//' 'quit' replace * -> NoQuit; verb 'end' * 'life' -> EndLife * 'game' -> Quit; extend only 'die' replace * -> myDie; extend only 'exit' * 'game' -> Quit; extend only 'cut' replace * noun noun -> myCut * noun 'with' noun -> myCut; verb 'untie' * noun -> Untie * noun noun -> Untie * noun 'from' noun -> Untie; verb 'breathe' * -> Breathe; verb 'work' * -> Work; verb 'do' 'perform' * 'work' -> Work; extend only 'get' * 'to' 'work' -> Work; verb 'struggle' 'thrash' * -> Struggle; [KillSub; <>;]; [StruggleSub; "There's nothing to struggle against.";]; [UntieSub; print_ret (The) noun, "isn't attached to anything.";]; [EndLifeSub; <>;]; [myDieSub; "You couldn't.";]; [RunAwaySub; "And go where? You wear the mark of ownership. You can't run away.";]; [NoQuitSub; "You can't quit. Master Rogan owns you. There is no quitting.";]; [myCutSub; if(second provides hardness) { if(noun == newPlayer) "Oh, dear, no, Laura. That would be painful."; if(noun == Rogan) <>; if(noun provides hardness) { if(second.hardness > noun.hardness) { move noun to actor; "You cut through ", (the) noun, " with ", (the) second, " ."; } "You try to use ", (the) second, " to cut ", (the) noun, " but ", (the) second, " is not strong enough."; } "There is no edge on ", (the) second; } ]; [BreatheSub; "You inhale and exhale."; ]; [WorkSub; ];